#include<stdio.h>

#include<malloc.h>

struct node{
       int value;
       struct node *next;
       }*start=NULL;
//=========================================================================================================================================


int sorti(void) {
struct node *a = NULL;
struct node *b = NULL; 
struct node *c = NULL;
struct node *e = NULL; 
struct node *tmp = NULL; 

while(e != start->next){
        c = a = start;
        b = a->next;
        while(a != e) 
        {
                if(a->value > b->value) 
                           {
                            if(a == start) 
                                 {
                                  tmp = b -> next;
                                  b->next = a;
                                  a->next = tmp;
                                  start = b;
                                  c = b;
                                  } 
                            else {
                                 tmp = b->next;
                                 b->next = a;
                                 a->next = tmp;
                                 c->next = b;
                                 c = b;
                                 }
                            } 
                else 
                            {
                             c = a;
                             a = a->next;
                             }
                b = a->next;
                if(b == e)
                e = a;
        }
                }
return 0;
}

//=========================================================================================================================================
int append(int v){
       struct node *f;
       struct node *q;
       f=(struct node *)malloc(sizeof(struct node));
       f->value=v;
       f->next=NULL;
       if(start==NULL){
                    start=f;
                    }
       else{
       for(q=start;q->next!=NULL;q=q->next);
       q->next=f;
       }
       return 0;
       }
       
       
//=========================================================================================================================================       
int del(int v){
    struct node *p;
    struct node *q;
    if(start->value==v){
                       start=start->next;
                       }
    else{                   
    for(p=start;(p->next)->value != v;p=p->next);
    q=p->next;
    p->next=q->next;
    free(q);
}
    return 0;
}
//========================================================================================================================================

int pop(int in){
    int i;
    struct node *p;
    struct node *q;
    if(in==0){
              start=start->next;
                       }
    else{                   
    for(p=start,i=0;((p->next) != NULL) && (i != (in-1)) ;p=p->next,i=i+1);
    q=p->next;
    p->next=q->next;
    free(q);
}
    return 0;
}


//========================================================================================================================================

int insert(int v,int in){
    int i;
    struct node *f;
    f=(struct node*) malloc(sizeof(struct node));
    f->value=v;
    struct node *k;
    k=start;
    for(i=0;i<(in-1);i++){
                      k=k->next;
                      }
    f->next=k->next;
    k->next=f;
return 0;
}                      
//=======================================================================================================================================                      

int indexi(int v){
int i;
struct node *p;
i=0;
for(p=start;(p->value)!= v;p=p->next){
    i=i+1;
}                     
printf("%d",i);
return 0;
}
                  
//===========================================================================================================================================

int reverse ()
{
struct node *temp=NULL; 
struct node *p=start;
struct node *o=NULL;
struct node *rear;
struct node *i;
for(i=start;(i->next) != NULL;i=i->next);
rear=i;
while (p!=NULL)
	{
	temp=p->next;
	p->next=o;
	o=p;
	p=temp;
	}
start=p;
start=rear;
rear=p;
return 0;
}
//=========================================================================================================================================
int count(){
    int v;
    struct node *p;
    int i;
    printf("enter the value to be counted:");
    scanf("%d",&v);
    i=0;
    for(p=start;(p->next)!= NULL;p->next){
                     if(p->value==v){
                                     i=i+1;
                                     }
                                     }
    printf("the times this no has occured is: %d",i);
    return 0;
}                             

//========================================================================================================================================
    
int main(){
    int i;
    struct node *p;
    for(i=0;i<5;i++){
                     append(i); 
                     }
    
    //sorti();
    //insert(56,3);

    //indexi(56);
    //pop(3);
    //reverse();
    //count();
    
    for(p=start;p!=NULL;p=p->next){
                                    printf("%d ",p->value);
                                    }
    
    
    return 0;
}
    
